package com.qinglei.recoup.common.service;

import com.qinglei.recoup.common.domain.ActiveUser;
import com.qinglei.recoup.common.exception.RedisConnectException;
import com.qinglei.recoup.system.domain.DictBO;
import com.qinglei.recoup.system.domain.Menu;
import com.qinglei.recoup.system.domain.Role;
import com.qinglei.recoup.system.domain.User;

import java.util.List;

public interface CacheService {

    /**
     * 测试 Redis是否连接成功
     */
    void testConnect() throws Exception;

    /**
     * 从缓存中获取用户
     *
     * @param userId 用户ID
     * @return User
     */
    User getUser(Long userId) throws Exception;

    /**
     * 从缓存中获取用户角色
     *
     * @param userId 用户名
     * @return 角色集
     */
    List<Role> getRoles(Long userId) throws Exception;

    /**
     * 从缓存中获取用户权限
     *
     * @param userId 用户名
     * @return 权限集
     */
    List<Menu> getPermissions(Long userId) throws Exception;

    /**
     * 缓存用户信息，只有当用户信息是查询出来的，完整的，才应该调用这个方法
     * 否则需要调用下面这个重载方法
     *
     * @param user 用户信息
     */
    void saveUser(User user) throws Exception;

    /**
     * 缓存用户信息
     *
     * @param userId 用户ID
     */
    void saveUser(Long userId) throws Exception;

    /**
     * 缓存用户角色信息
     *
     * @param userId 用户名
     */
    void saveRoles(Long userId) throws Exception;

    /**
     * 缓存用户权限信息
     *
     * @param userId 用户名
     */
    void savePermissions(Long userId) throws Exception;

    /**
     * 删除用户信息
     *
     * @param userId 用户ID
     */
    void deleteUser(Long userId) throws Exception;

    /**
     * 删除用户角色信息
     *
     * @param userId 用户名
     */
    void deleteRoles(Long userId) throws Exception;

    /**
     * 删除用户权限信息
     *
     * @param userId 用户名
     */
    void deletePermissions(Long userId) throws Exception;

    /**
     * 获取当前在线护工用户
     *
     * @return
     */
    List<ActiveUser> getOnlineNurse() throws RedisConnectException;

    /**
     * 获取在线用户数据
     *
     * @param userId
     * @return
     */
    ActiveUser getOnlineUser(Long userId) throws RedisConnectException;

    void saveDictItemGroup(String itemGroup) throws RedisConnectException;

    void deleteDictItemGroup(String itemGroup) throws RedisConnectException;

    DictBO getDictItem(String itemGroup, Long key) throws RedisConnectException;

    List<DictBO> getDictItemList(String itemGroup) throws RedisConnectException;

//    void saveOutBedTimeout(Integer val) throws RedisConnectException;
//    void saveTakeEventTimeout(Integer tenantId, Integer val) throws RedisConnectException;
//    Integer getOutBedTimeout() throws RedisConnectException;
//    Integer getTakeEventTimeout(Integer tenantId) throws RedisConnectException;
}
